/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package agb.Modelo;


import agb.Conexion.Conexion;
import java.sql.*;
import java.util.ArrayList;
import java.util.Vector;

/**
 *
 * @author Servidor
 */
public class Promedios {
    private double nota1, nota2, nota3, mensual, promedioMes, 
            promedioSemanal, mes1, mes2, mes3, promedioBimestral,
            promedioTrimestral, notaBimestral, notaTrimestral;
    private String curso;

    public double getNota1() {
        return nota1;
    }

    public void setNota1(double nota1) {
        this.nota1 = nota1;
    }

    public double getNota2() {
        return nota2;
    }

    public void setNota2(double nota2) {
        this.nota2 = nota2;
    }

    public double getNota3() {
        return nota3;
    }

    public void setNota3(double nota3) {
        this.nota3 = nota3;
    }

    public double getMensual() {
        return mensual;
    }

    public void setMensual(double mensual) {
        this.mensual = mensual;
    }
    
    public static ArrayList<Promedios> notasMes01(int cod_persona){
        Promedios oPromedio = null;
        ArrayList<Promedios> LNotas = new ArrayList<Promedios>();
        Connection cn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        String sql = "SELECT CR.NOMBRE, " +
                "CASE WHEN E.codevaluacion = 1 THEN C.NOTA ELSE 0 END as semanal_1, " +
                "CASE WHEN E.codevaluacion = 2 THEN C.NOTA ELSE 0 END as semanal_2, " +
                "CASE WHEN E.codevaluacion = 3 THEN C.NOTA ELSE 0 END as semanal_3, " +
                "CASE WHEN E.codevaluacion = 6 THEN C.NOTA ELSE 0 END as mensual_1 " +
                "FROM MATRICULA M " +
                "LEFT JOIN calificacion C ON M.cod_matricula = C.cod_matricula " +
                "INNER JOIN CURSO CR ON CR.cod_curso = C.cod_curso " +
                "INNER JOIN evaluacion_programada EP ON EP.codevaluacionprog =  C.codevaluacionprog " +
                "INNER JOIN evaluacion E ON E.codevaluacion = EP.codevaluacion " +
                "WHERE M.cod_persona = ? AND " +
                "EXTRACT(YEAR  FROM EP.fecha_registro) = year(?) AND " +
               
                "(E.codevaluacion = 1 OR E.codevaluacion = 2 or E.codevaluacion = 3 or E.codevaluacion = 6) " +
                "ORDER BY EP.fecha_registro,CR.nombre" ;         
        try{             
            cn = Conexion.getConexion();
            ps = cn.prepareStatement(sql);
            ps.setInt(1, cod_persona);
            ps.setInt(2, cod_persona);
            rs = ps.executeQuery();
            while(rs.next()){
                oPromedio = new Promedios();
                oPromedio.setCurso(rs.getString(1));
                oPromedio.setNota1(rs.getDouble(2));
                oPromedio.setNota2(rs.getDouble(3));
                oPromedio.setNota3(rs.getDouble(4));
                oPromedio.setMensual(rs.getDouble(5));
                LNotas.add(oPromedio);
            }
        Conexion.cerrarPreparedStatement(ps);
        Conexion.cerrarConexion(cn);
        }catch(SQLException ex){
            ex.printStackTrace();
            Conexion.cerrarPreparedStatement(ps);
            Conexion.cerrarConexion(cn);
        }catch(Exception ex){
            ex.printStackTrace();
        }
        return LNotas;
    }
    
    public static ArrayList<Promedios> notasMes02(int cod_persona){
        Promedios oPromedio = null;
        ArrayList<Promedios> LNotas = new ArrayList<Promedios>();
        Connection cn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        String sql = "SELECT CR.NOMBRE, " +
                "CASE WHEN E.codevaluacion = 4 THEN C.NOTA ELSE 0 END as semanal_4, " +
                "CASE WHEN E.codevaluacion = 5 THEN C.NOTA ELSE 0 END as semanal_5, " +
                "CASE WHEN E.codevaluacion = 7 THEN C.NOTA ELSE 0 END as semanal_6, " +
                "CASE WHEN E.codevaluacion = 12 THEN C.NOTA ELSE 0 END as mensual_2 " +
                "FROM MATRICULA M " +
                "LEFT JOIN calificacion C ON M.cod_matricula = C.cod_matricula " +
                "INNER JOIN CURSO CR ON CR.cod_curso = C.cod_curso " +
                "INNER JOIN evaluacion_programada EP ON EP.codevaluacionprog =  C.codevaluacionprog " +
                "INNER JOIN evaluacion E ON E.codevaluacion = EP.codevaluacion " +
                "WHERE M.cod_persona = ? AND " +
                "EXTRACT(YEAR  FROM EP.fecha_registro) = year(?) AND " +
                
                "(E.codevaluacion = 4 OR E.codevaluacion = 5 or E.codevaluacion = 7 or E.codevaluacion = 12) " +
                "ORDER BY EP.fecha_registro,CR.nombre" ;         
        try{             
            cn = Conexion.getConexion();
            ps = cn.prepareStatement(sql);
            ps.setInt(1, cod_persona);
            ps.setInt(2, cod_persona);
            rs = ps.executeQuery();
            while(rs.next()){
                oPromedio = new Promedios();
                oPromedio.setCurso(rs.getString(1));
                oPromedio.setNota1(rs.getDouble(2));
                oPromedio.setNota2(rs.getDouble(3));
                oPromedio.setNota3(rs.getDouble(4));
                oPromedio.setMensual(rs.getDouble(5));
                LNotas.add(oPromedio);
            }
        Conexion.cerrarPreparedStatement(ps);
        Conexion.cerrarConexion(cn);
        }catch(SQLException ex){
            ex.printStackTrace();
            Conexion.cerrarPreparedStatement(ps);
            Conexion.cerrarConexion(cn);
        }catch(Exception ex){
            ex.printStackTrace();
        }
        return LNotas;
    }
    
    
    public static ArrayList<Promedios> notasMes03(int cod_persona){
        Promedios oPromedio = null;
        ArrayList<Promedios> LNotas = new ArrayList<Promedios>();
        Connection cn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        String sql = "SELECT CR.NOMBRE, " +
                "CASE WHEN E.codevaluacion = 8 THEN C.NOTA ELSE 0 END as semanal_7, " +
                "CASE WHEN E.codevaluacion = 10 THEN C.NOTA ELSE 0 END as semanal_8, " +
                "CASE WHEN E.codevaluacion = 11 THEN C.NOTA ELSE 0 END as semanal_9, " +
                "CASE WHEN E.codevaluacion = 16 THEN C.NOTA ELSE 0 END as mensual_3 " +
                "FROM MATRICULA M " +
                "LEFT JOIN calificacion C ON M.cod_matricula = C.cod_matricula " +
                "INNER JOIN CURSO CR ON CR.cod_curso = C.cod_curso " +
                "INNER JOIN evaluacion_programada EP ON EP.codevaluacionprog =  C.codevaluacionprog " +
                "INNER JOIN evaluacion E ON E.codevaluacion = EP.codevaluacion " +
                "WHERE M.cod_persona = ? AND " +
                "EXTRACT(YEAR  FROM EP.fecha_registro) = year(?) AND " +
                "(E.codevaluacion = 8 OR E.codevaluacion = 10 or E.codevaluacion = 11 or E.codevaluacion = 16) " +
                "ORDER BY EP.fecha_registro,CR.nombre" ;         
        try{             
            cn = Conexion.getConexion();
            ps = cn.prepareStatement(sql);
            ps.setInt(1, cod_persona);
            ps.setInt(2, cod_persona);
            rs = ps.executeQuery();
            while(rs.next()){
                oPromedio = new Promedios();
                oPromedio.setCurso(rs.getString(1));
                oPromedio.setNota1(rs.getDouble(2));
                oPromedio.setNota2(rs.getDouble(3));
                oPromedio.setNota3(rs.getDouble(4));
                oPromedio.setMensual(rs.getDouble(5));
                LNotas.add(oPromedio);
            }
        Conexion.cerrarPreparedStatement(ps);
        Conexion.cerrarConexion(cn);
        }catch(SQLException ex){
            ex.printStackTrace();
            Conexion.cerrarPreparedStatement(ps);
            Conexion.cerrarConexion(cn);
        }catch(Exception ex){
            ex.printStackTrace();
        }
        return LNotas;
    }
    
public static ArrayList<Promedios> notasMes04(int cod_persona){
        Promedios oPromedio = null;
        ArrayList<Promedios> LNotas = new ArrayList<Promedios>();
        Connection cn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        String sql = "SELECT CR.NOMBRE, " +
                "CASE WHEN E.codevaluacion = 13 THEN C.NOTA ELSE 0 END as semanal_10, " +
                "CASE WHEN E.codevaluacion = 14 THEN C.NOTA ELSE 0 END as semanal_11, " +
                "CASE WHEN E.codevaluacion = 15 THEN C.NOTA ELSE 0 END as semanal_12, " +
                "CASE WHEN E.codevaluacion = 18 THEN C.NOTA ELSE 0 END as mensual_4 " +
                "FROM MATRICULA M " +
                "LEFT JOIN calificacion C ON M.cod_matricula = C.cod_matricula " +
                "INNER JOIN CURSO CR ON CR.cod_curso = C.cod_curso " +
                "INNER JOIN evaluacion_programada EP ON EP.codevaluacionprog =  C.codevaluacionprog " +
                "INNER JOIN evaluacion E ON E.codevaluacion = EP.codevaluacion " +
                "WHERE M.cod_persona = ? AND " +
                "EXTRACT(YEAR  FROM EP.fecha_registro) = year(?) AND " +
                "(E.codevaluacion = 13 OR E.codevaluacion = 14 or E.codevaluacion = 15 or E.codevaluacion = 18) " +
                "ORDER BY EP.fecha_registro,CR.nombre" ;         
        try{             
            cn = Conexion.getConexion();
            ps = cn.prepareStatement(sql);
            ps.setInt(1, cod_persona);
            ps.setInt(2, cod_persona);
            rs = ps.executeQuery();
            while(rs.next()){
                oPromedio = new Promedios();
                oPromedio.setCurso(rs.getString(1));
                oPromedio.setNota1(rs.getDouble(2));
                oPromedio.setNota2(rs.getDouble(3));
                oPromedio.setNota3(rs.getDouble(4));
                oPromedio.setMensual(rs.getDouble(5));
                LNotas.add(oPromedio);
            }
        Conexion.cerrarPreparedStatement(ps);
        Conexion.cerrarConexion(cn);
        }catch(SQLException ex){
            ex.printStackTrace();
            Conexion.cerrarPreparedStatement(ps);
            Conexion.cerrarConexion(cn);
        }catch(Exception ex){
            ex.printStackTrace();
        }
        return LNotas;
    }

public static ArrayList<Promedios> notasMes05(int cod_persona){
        Promedios oPromedio = null;
        ArrayList<Promedios> LNotas = new ArrayList<Promedios>();
        Connection cn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        String sql = "SELECT CR.NOMBRE, " +
                "CASE WHEN E.codevaluacion = 30 THEN C.NOTA ELSE 0 END as semanal_13, " +
                "CASE WHEN E.codevaluacion = 31 THEN C.NOTA ELSE 0 END as semanal_14, " +
                "CASE WHEN E.codevaluacion = 32 THEN C.NOTA ELSE 0 END as semanal_15, " +
                "CASE WHEN E.codevaluacion = 20 THEN C.NOTA ELSE 0 END as mensual_5 " +
                "FROM MATRICULA M " +
                "LEFT JOIN calificacion C ON M.cod_matricula = C.cod_matricula " +
                "INNER JOIN CURSO CR ON CR.cod_curso = C.cod_curso " +
                "INNER JOIN evaluacion_programada EP ON EP.codevaluacionprog =  C.codevaluacionprog " +
                "INNER JOIN evaluacion E ON E.codevaluacion = EP.codevaluacion " +
                "WHERE M.cod_persona = ? AND " +
                "EXTRACT(YEAR  FROM EP.fecha_registro) = year(?) AND " +
                "(E.codevaluacion = 30 OR E.codevaluacion = 31 or E.codevaluacion = 32 or E.codevaluacion = 20) " +
                "ORDER BY EP.fecha_registro,CR.nombre" ;         
        try{             
            cn = Conexion.getConexion();
            ps = cn.prepareStatement(sql);
            ps.setInt(1, cod_persona);
            ps.setInt(2, cod_persona);
            rs = ps.executeQuery();
            while(rs.next()){
                oPromedio = new Promedios();
                oPromedio.setCurso(rs.getString(1));
                oPromedio.setNota1(rs.getDouble(2));
                oPromedio.setNota2(rs.getDouble(3));
                oPromedio.setNota3(rs.getDouble(4));
                oPromedio.setMensual(rs.getDouble(5));
                LNotas.add(oPromedio);
            }
        Conexion.cerrarPreparedStatement(ps);
        Conexion.cerrarConexion(cn);
        }catch(SQLException ex){
            ex.printStackTrace();
            Conexion.cerrarPreparedStatement(ps);
            Conexion.cerrarConexion(cn);
        }catch(Exception ex){
            ex.printStackTrace();
        }
        return LNotas;
    }

public static ArrayList<Promedios> notasMes06(int cod_persona){
        Promedios oPromedio = null;
        ArrayList<Promedios> LNotas = new ArrayList<Promedios>();
        Connection cn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        String sql = "SELECT CR.NOMBRE, " +
                "CASE WHEN E.codevaluacion = 33 THEN C.NOTA ELSE 0 END as semanal_16, " +
                "CASE WHEN E.codevaluacion = 34 THEN C.NOTA ELSE 0 END as semanal_17, " +
                "CASE WHEN E.codevaluacion = 35 THEN C.NOTA ELSE 0 END as semanal_18, " +
                "CASE WHEN E.codevaluacion = 21 THEN C.NOTA ELSE 0 END as mensual_6 " +
                "FROM MATRICULA M " +
                "LEFT JOIN calificacion C ON M.cod_matricula = C.cod_matricula " +
                "INNER JOIN CURSO CR ON CR.cod_curso = C.cod_curso " +
                "INNER JOIN evaluacion_programada EP ON EP.codevaluacionprog =  C.codevaluacionprog " +
                "INNER JOIN evaluacion E ON E.codevaluacion = EP.codevaluacion " +
                "WHERE M.cod_persona = ? AND " +
                "EXTRACT(YEAR  FROM EP.fecha_registro) = year(?) AND " +
                "(E.codevaluacion = 33 OR E.codevaluacion = 34 or E.codevaluacion = 35 or E.codevaluacion = 21) " +
                "ORDER BY EP.fecha_registro,CR.nombre" ;         
        try{             
            cn = Conexion.getConexion();
            ps = cn.prepareStatement(sql);
            ps.setInt(1, cod_persona);
            ps.setInt(2, cod_persona);
            rs = ps.executeQuery();
            while(rs.next()){
                oPromedio = new Promedios();
                oPromedio.setCurso(rs.getString(1));
                oPromedio.setNota1(rs.getDouble(2));
                oPromedio.setNota2(rs.getDouble(3));
                oPromedio.setNota3(rs.getDouble(4));
                oPromedio.setMensual(rs.getDouble(5));
                LNotas.add(oPromedio);
            }
        Conexion.cerrarPreparedStatement(ps);
        Conexion.cerrarConexion(cn);
        }catch(SQLException ex){
            ex.printStackTrace();
            Conexion.cerrarPreparedStatement(ps);
            Conexion.cerrarConexion(cn);
        }catch(Exception ex){
            ex.printStackTrace();
        }
        return LNotas;
    }

public static ArrayList<Promedios> notasMes07(int cod_persona){
        Promedios oPromedio = null;
        ArrayList<Promedios> LNotas = new ArrayList<Promedios>();
        Connection cn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        String sql = "SELECT CR.NOMBRE, " +
                "CASE WHEN E.codevaluacion = 36 THEN C.NOTA ELSE 0 END as semanal_19, " +
                "CASE WHEN E.codevaluacion = 37 THEN C.NOTA ELSE 0 END as semanal_20, " +
                "CASE WHEN E.codevaluacion = 38 THEN C.NOTA ELSE 0 END as semanal_21, " +
                "CASE WHEN E.codevaluacion = 24 THEN C.NOTA ELSE 0 END as mensual_7 " +
                "FROM MATRICULA M " +
                "LEFT JOIN calificacion C ON M.cod_matricula = C.cod_matricula " +
                "INNER JOIN CURSO CR ON CR.cod_curso = C.cod_curso " +
                "INNER JOIN evaluacion_programada EP ON EP.codevaluacionprog =  C.codevaluacionprog " +
                "INNER JOIN evaluacion E ON E.codevaluacion = EP.codevaluacion " +
                "WHERE M.cod_persona = ? AND " +
                "EXTRACT(YEAR  FROM EP.fecha_registro) = year(?) AND " +
                "(E.codevaluacion = 36 OR E.codevaluacion = 37 or E.codevaluacion = 38 or E.codevaluacion = 24) " +
                "ORDER BY EP.fecha_registro,CR.nombre" ;         
        try{             
            cn = Conexion.getConexion();
            ps = cn.prepareStatement(sql);
            ps.setInt(1, cod_persona);
            ps.setInt(2, cod_persona);
            rs = ps.executeQuery();
            while(rs.next()){
                oPromedio = new Promedios();
                oPromedio.setCurso(rs.getString(1));
                oPromedio.setNota1(rs.getDouble(2));
                oPromedio.setNota2(rs.getDouble(3));
                oPromedio.setNota3(rs.getDouble(4));
                oPromedio.setMensual(rs.getDouble(5));
                LNotas.add(oPromedio);
            }
        Conexion.cerrarPreparedStatement(ps);
        Conexion.cerrarConexion(cn);
        }catch(SQLException ex){
            ex.printStackTrace();
            Conexion.cerrarPreparedStatement(ps);
            Conexion.cerrarConexion(cn);
        }catch(Exception ex){
            ex.printStackTrace();
        }
        return LNotas;
    }

public static ArrayList<Promedios> notasMes08(int cod_persona){
        Promedios oPromedio = null;
        ArrayList<Promedios> LNotas = new ArrayList<Promedios>();
        Connection cn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        String sql = "SELECT CR.NOMBRE, " +
                "CASE WHEN E.codevaluacion = 39 THEN C.NOTA ELSE 0 END as semanal_22, " +
                "CASE WHEN E.codevaluacion = 40 THEN C.NOTA ELSE 0 END as semanal_23, " +
                "CASE WHEN E.codevaluacion = 41 THEN C.NOTA ELSE 0 END as semanal_24, " +
                "CASE WHEN E.codevaluacion = 25 THEN C.NOTA ELSE 0 END as mensual_8 " +
                "FROM MATRICULA M " +
                "LEFT JOIN calificacion C ON M.cod_matricula = C.cod_matricula " +
                "INNER JOIN CURSO CR ON CR.cod_curso = C.cod_curso " +
                "INNER JOIN evaluacion_programada EP ON EP.codevaluacionprog =  C.codevaluacionprog " +
                "INNER JOIN evaluacion E ON E.codevaluacion = EP.codevaluacion " +
                "WHERE M.cod_persona = ? AND " +
                "EXTRACT(YEAR  FROM EP.fecha_registro) = year(?) AND " +
                "(E.codevaluacion = 39 OR E.codevaluacion = 40 or E.codevaluacion = 41 or E.codevaluacion = 25) " +
                "ORDER BY EP.fecha_registro,CR.nombre" ;         
        try{             
            cn = Conexion.getConexion();
            ps = cn.prepareStatement(sql);
            ps.setInt(1, cod_persona);
            ps.setInt(2, cod_persona);
            rs = ps.executeQuery();
            while(rs.next()){
                oPromedio = new Promedios();
                oPromedio.setCurso(rs.getString(1));
                oPromedio.setNota1(rs.getDouble(2));
                oPromedio.setNota2(rs.getDouble(3));
                oPromedio.setNota3(rs.getDouble(4));
                oPromedio.setMensual(rs.getDouble(5));
                LNotas.add(oPromedio);
            }
        Conexion.cerrarPreparedStatement(ps);
        Conexion.cerrarConexion(cn);
        }catch(SQLException ex){
            ex.printStackTrace();
            Conexion.cerrarPreparedStatement(ps);
            Conexion.cerrarConexion(cn);
        }catch(Exception ex){
            ex.printStackTrace();
        }
        return LNotas;
    }

public static ArrayList<Promedios> notasMes09(int cod_persona){
        Promedios oPromedio = null;
        ArrayList<Promedios> LNotas = new ArrayList<Promedios>();
        Connection cn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        String sql = "SELECT CR.NOMBRE, " +
                "CASE WHEN E.codevaluacion = 42 THEN C.NOTA ELSE 0 END as semanal_25, " +
                "CASE WHEN E.codevaluacion = 43 THEN C.NOTA ELSE 0 END as semanal_26, " +
                "CASE WHEN E.codevaluacion = 44 THEN C.NOTA ELSE 0 END as semanal_27, " +
                "CASE WHEN E.codevaluacion = 26 THEN C.NOTA ELSE 0 END as mensual_9 " +
                "FROM MATRICULA M " +
                "LEFT JOIN calificacion C ON M.cod_matricula = C.cod_matricula " +
                "INNER JOIN CURSO CR ON CR.cod_curso = C.cod_curso " +
                "INNER JOIN evaluacion_programada EP ON EP.codevaluacionprog =  C.codevaluacionprog " +
                "INNER JOIN evaluacion E ON E.codevaluacion = EP.codevaluacion " +
                "WHERE M.cod_persona = ? AND " +
                "EXTRACT(YEAR  FROM EP.fecha_registro) = year(?) AND " +
                "(E.codevaluacion = 42 OR E.codevaluacion = 43 or E.codevaluacion = 44 or E.codevaluacion = 26) " +
                "ORDER BY EP.fecha_registro,CR.nombre" ;         
        try{             
            cn = Conexion.getConexion();
            ps = cn.prepareStatement(sql);
            ps.setInt(1, cod_persona);
            ps.setInt(2, cod_persona);
            rs = ps.executeQuery();
            while(rs.next()){
                oPromedio = new Promedios();
                oPromedio.setCurso(rs.getString(1));
                oPromedio.setNota1(rs.getDouble(2));
                oPromedio.setNota2(rs.getDouble(3));
                oPromedio.setNota3(rs.getDouble(4));
                oPromedio.setMensual(rs.getDouble(5));
                LNotas.add(oPromedio);
            }
        Conexion.cerrarPreparedStatement(ps);
        Conexion.cerrarConexion(cn);
        }catch(SQLException ex){
            ex.printStackTrace();
            Conexion.cerrarPreparedStatement(ps);
            Conexion.cerrarConexion(cn);
        }catch(Exception ex){
            ex.printStackTrace();
        }
        return LNotas;
    }

public static ArrayList<Promedios> notasBimestre01(int cod_persona){
        Promedios oPromedio = null;
        ArrayList<Promedios> LNotas = new ArrayList<Promedios>();
        Connection cn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        String sql = "SELECT CR.NOMBRE, " +
                "CASE WHEN E.codevaluacion = 9 THEN C.NOTA ELSE 0 END as Bimestre_1 " +
                "FROM MATRICULA M " +
                "LEFT JOIN calificacion C ON M.cod_matricula = C.cod_matricula " +
                "INNER JOIN CURSO CR ON CR.cod_curso = C.cod_curso " +
                "INNER JOIN evaluacion_programada EP ON EP.codevaluacionprog =  C.codevaluacionprog " +
                "INNER JOIN evaluacion E ON E.codevaluacion = EP.codevaluacion " +
                "WHERE M.cod_persona = ? " +
                "AND EXTRACT(YEAR  FROM EP.fecha_registro) = year(?) " +
                "AND E.codevaluacion = 9 ORDER BY EP.fecha_registro,CR.nombre" ;         
        try{             
            cn = Conexion.getConexion();
            ps = cn.prepareStatement(sql);
            ps.setInt(1, cod_persona);
            ps.setInt(2, cod_persona);
            rs = ps.executeQuery();
            while(rs.next()){
                oPromedio = new Promedios();
                oPromedio.setCurso(rs.getString(1));
                oPromedio.setNotaBimestral(rs.getDouble(2));                
                LNotas.add(oPromedio);
            }
        Conexion.cerrarPreparedStatement(ps);
        Conexion.cerrarConexion(cn);
        }catch(SQLException ex){
            ex.printStackTrace();
            Conexion.cerrarPreparedStatement(ps);
            Conexion.cerrarConexion(cn);
        }catch(Exception ex){
            ex.printStackTrace();
        }
        return LNotas;
    }

public static ArrayList<Promedios> notasBimestre02(int cod_persona){
        Promedios oPromedio = null;
        ArrayList<Promedios> LNotas = new ArrayList<Promedios>();
        Connection cn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        String sql = "SELECT CR.NOMBRE, " +
                "CASE WHEN E.codevaluacion = 19 THEN C.NOTA ELSE 0 END as Bimestre_2 " +
                "FROM MATRICULA M " +
                "LEFT JOIN calificacion C ON M.cod_matricula = C.cod_matricula " +
                "INNER JOIN CURSO CR ON CR.cod_curso = C.cod_curso " +
                "INNER JOIN evaluacion_programada EP ON EP.codevaluacionprog =  C.codevaluacionprog " +
                "INNER JOIN evaluacion E ON E.codevaluacion = EP.codevaluacion " +
                "WHERE M.cod_persona = ? " +
                "AND EXTRACT(YEAR  FROM EP.fecha_registro) = year(?) " +
                "AND E.codevaluacion = 19 ORDER BY EP.fecha_registro,CR.nombre" ;         
        try{             
            cn = Conexion.getConexion();
            ps = cn.prepareStatement(sql);
            ps.setInt(1, cod_persona);
            ps.setInt(2, cod_persona);
            rs = ps.executeQuery();
            while(rs.next()){
                oPromedio = new Promedios();
                oPromedio.setCurso(rs.getString(1));
                oPromedio.setNotaBimestral(rs.getDouble(2));                
                LNotas.add(oPromedio);
            }
        Conexion.cerrarPreparedStatement(ps);
        Conexion.cerrarConexion(cn);
        }catch(SQLException ex){
            ex.printStackTrace();
            Conexion.cerrarPreparedStatement(ps);
            Conexion.cerrarConexion(cn);
        }catch(Exception ex){
            ex.printStackTrace();
        }
        return LNotas;
    }


public static ArrayList<Promedios> notasBimestre03(int cod_persona){
        Promedios oPromedio = null;
        ArrayList<Promedios> LNotas = new ArrayList<Promedios>();
        Connection cn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        String sql = "SELECT CR.NOMBRE, " +
                "CASE WHEN E.codevaluacion = 23 THEN C.NOTA ELSE 0 END as Bimestre_2 " +
                "FROM MATRICULA M " +
                "LEFT JOIN calificacion C ON M.cod_matricula = C.cod_matricula " +
                "INNER JOIN CURSO CR ON CR.cod_curso = C.cod_curso " +
                "INNER JOIN evaluacion_programada EP ON EP.codevaluacionprog =  C.codevaluacionprog " +
                "INNER JOIN evaluacion E ON E.codevaluacion = EP.codevaluacion " +
                "WHERE M.cod_persona = ? " +
                "AND EXTRACT(YEAR  FROM EP.fecha_registro) = year(?) " +
                "AND E.codevaluacion = 23 ORDER BY EP.fecha_registro,CR.nombre" ;         
        try{             
            cn = Conexion.getConexion();
            ps = cn.prepareStatement(sql);
            ps.setInt(1, cod_persona);
            ps.setInt(2, cod_persona);
            rs = ps.executeQuery();
            while(rs.next()){
                oPromedio = new Promedios();
                oPromedio.setCurso(rs.getString(1));
                oPromedio.setNotaBimestral(rs.getDouble(2));                
                LNotas.add(oPromedio);
            }
        Conexion.cerrarPreparedStatement(ps);
        Conexion.cerrarConexion(cn);
        }catch(SQLException ex){
            ex.printStackTrace();
            Conexion.cerrarPreparedStatement(ps);
            Conexion.cerrarConexion(cn);
        }catch(Exception ex){
            ex.printStackTrace();
        }
        return LNotas;
    }

    public static ArrayList<Promedios> notasBimestre04(int cod_persona){
        Promedios oPromedio = null;
        ArrayList<Promedios> LNotas = new ArrayList<Promedios>();
        Connection cn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        String sql = "SELECT CR.NOMBRE, " +
                "CASE WHEN E.codevaluacion = 27 THEN C.NOTA ELSE 0 END as Bimestre_2 " +
                "FROM MATRICULA M " +
                "LEFT JOIN calificacion C ON M.cod_matricula = C.cod_matricula " +
                "INNER JOIN CURSO CR ON CR.cod_curso = C.cod_curso " +
                "INNER JOIN evaluacion_programada EP ON EP.codevaluacionprog =  C.codevaluacionprog " +
                "INNER JOIN evaluacion E ON E.codevaluacion = EP.codevaluacion " +
                "WHERE M.cod_persona = ? " +
                "AND EXTRACT(YEAR  FROM EP.fecha_registro) = year(?) " +
                "AND E.codevaluacion = 27 ORDER BY EP.fecha_registro,CR.nombre" ;         
        try{             
            cn = Conexion.getConexion();
            ps = cn.prepareStatement(sql);
            ps.setInt(1, cod_persona);
            ps.setInt(2, cod_persona);
            rs = ps.executeQuery();
            while(rs.next()){
                oPromedio = new Promedios();
                oPromedio.setCurso(rs.getString(1));
                oPromedio.setNotaBimestral(rs.getDouble(2));                
                LNotas.add(oPromedio);
            }
        Conexion.cerrarPreparedStatement(ps);
        Conexion.cerrarConexion(cn);
        }catch(SQLException ex){
            ex.printStackTrace();
            Conexion.cerrarPreparedStatement(ps);
            Conexion.cerrarConexion(cn);
        }catch(Exception ex){
            ex.printStackTrace();
        }
        return LNotas;
    }
    
    public static ArrayList<Promedios> notasTrimestre01(int cod_persona){
        Promedios oPromedio = null;
        ArrayList<Promedios> LNotas = new ArrayList<Promedios>();
        Connection cn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        String sql = " SELECT CR.NOMBRE,                 " +
                "CASE WHEN E.codevaluacion = 17 THEN C.NOTA ELSE 0 END as trimestral_1                 " +
                "FROM MATRICULA M                 " +
                "LEFT JOIN calificacion C ON M.cod_matricula = C.cod_matricula                 " +
                "INNER JOIN CURSO CR ON CR.cod_curso = C.cod_curso                 " +
                "INNER JOIN evaluacion_programada EP ON EP.codevaluacionprog =  C.codevaluacionprog                 " +
                "INNER JOIN evaluacion E ON E.codevaluacion = EP.codevaluacion                 " +
                "WHERE M.cod_persona = ? AND                 " +
                "EXTRACT(YEAR  FROM EP.fecha_registro) = year(?) " +
                "AND   E.codevaluacion = 17                  " +
                "ORDER BY EP.fecha_registro,CR.nombre" ;         
        try{             
            cn = Conexion.getConexion();
            ps = cn.prepareStatement(sql);
            ps.setInt(1, cod_persona);
            ps.setInt(2, cod_persona);
            rs = ps.executeQuery();
            while(rs.next()){
                oPromedio = new Promedios();
                oPromedio.setCurso(rs.getString(1));
                oPromedio.setNotaTrimestral(rs.getDouble(2));                
                LNotas.add(oPromedio);
            }
        Conexion.cerrarPreparedStatement(ps);
        Conexion.cerrarConexion(cn);
        }catch(SQLException ex){
            ex.printStackTrace();
            Conexion.cerrarPreparedStatement(ps);
            Conexion.cerrarConexion(cn);
        }catch(Exception ex){
            ex.printStackTrace();
        }
        return LNotas;
    }
    
        public static ArrayList<Promedios> notasTrimestre02(int cod_persona){
        Promedios oPromedio = null;
        ArrayList<Promedios> LNotas = new ArrayList<Promedios>();
        Connection cn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        String sql = " SELECT CR.NOMBRE,                 " +
                "CASE WHEN E.codevaluacion = 22 THEN C.NOTA ELSE 0 END as trimestral_2                 " +
                "FROM MATRICULA M                 " +
                "LEFT JOIN calificacion C ON M.cod_matricula = C.cod_matricula                 " +
                "INNER JOIN CURSO CR ON CR.cod_curso = C.cod_curso                 " +
                "INNER JOIN evaluacion_programada EP ON EP.codevaluacionprog =  C.codevaluacionprog                 " +
                "INNER JOIN evaluacion E ON E.codevaluacion = EP.codevaluacion                 " +
                "WHERE M.cod_persona = ? AND                 " +
                "EXTRACT(YEAR  FROM EP.fecha_registro) = year(?) " +
                "AND   E.codevaluacion = 22                  " +
                "ORDER BY EP.fecha_registro,CR.nombre" ;         
        try{             
            cn = Conexion.getConexion();
            ps = cn.prepareStatement(sql);
            ps.setInt(1, cod_persona);
            ps.setInt(2, cod_persona);
            rs = ps.executeQuery();
            while(rs.next()){
                oPromedio = new Promedios();
                oPromedio.setCurso(rs.getString(1));
                oPromedio.setNotaTrimestral(rs.getDouble(2));                
                LNotas.add(oPromedio);
            }
        Conexion.cerrarPreparedStatement(ps);
        Conexion.cerrarConexion(cn);
        }catch(SQLException ex){
            ex.printStackTrace();
            Conexion.cerrarPreparedStatement(ps);
            Conexion.cerrarConexion(cn);
        }catch(Exception ex){
            ex.printStackTrace();
        }
        return LNotas;
    }
        
        
        public static ArrayList<Promedios> notasTrimestre03(int cod_persona){
        Promedios oPromedio = null;
        ArrayList<Promedios> LNotas = new ArrayList<Promedios>();
        Connection cn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        String sql = " SELECT CR.NOMBRE,                 " +
                "CASE WHEN E.codevaluacion = 28 THEN C.NOTA ELSE 0 END as trimestral_1                 " +
                "FROM MATRICULA M                 " +
                "LEFT JOIN calificacion C ON M.cod_matricula = C.cod_matricula                 " +
                "INNER JOIN CURSO CR ON CR.cod_curso = C.cod_curso                 " +
                "INNER JOIN evaluacion_programada EP ON EP.codevaluacionprog =  C.codevaluacionprog                 " +
                "INNER JOIN evaluacion E ON E.codevaluacion = EP.codevaluacion                 " +
                "WHERE M.cod_persona = ? AND                 " +
                "EXTRACT(YEAR  FROM EP.fecha_registro) = year(?) " +
                "AND   E.codevaluacion = 28                  " +
                "ORDER BY EP.fecha_registro,CR.nombre" ;         
        try{             
            cn = Conexion.getConexion();
            ps = cn.prepareStatement(sql);
            ps.setInt(1, cod_persona);
            ps.setInt(2, cod_persona);
            rs = ps.executeQuery();
            while(rs.next()){
                oPromedio = new Promedios();
                oPromedio.setCurso(rs.getString(1));
                oPromedio.setNotaTrimestral(rs.getDouble(2));                
                LNotas.add(oPromedio);
            }
        Conexion.cerrarPreparedStatement(ps);
        Conexion.cerrarConexion(cn);
        }catch(SQLException ex){
            ex.printStackTrace();
            Conexion.cerrarPreparedStatement(ps);
            Conexion.cerrarConexion(cn);
        }catch(Exception ex){
            ex.printStackTrace();
        }
        return LNotas;
    }
    
    public ArrayList<Promedios>calculaPromBimestral(ArrayList<Promedios> PromMensuales,int pesoPromMensual, int PesoBimestral){
        int peso = (pesoPromMensual * 2) + PesoBimestral;
        System.out.println(peso);
        int nuevoPeso = peso;
        for(Promedios o: PromMensuales){
            if(o.getMes1()==0){
                peso = peso - pesoPromMensual;
            }
            if(o.getMes2()==0){
                 peso = peso - pesoPromMensual;
            }
            if(o.getNotaBimestral()==0){
                 peso = peso - PesoBimestral;
            }
            if(peso==0){
                 peso = 1;
            }
            double promBimestral = 0;
            promBimestral = ((o.getMes1()* pesoPromMensual) + (o.getMes2() * pesoPromMensual) + (o.getNotaBimestral()* PesoBimestral))/peso;
            o.setPromedioBimestral(promBimestral);
            peso = nuevoPeso;
        }
        return PromMensuales;
    }

    public static ArrayList<Promedios>calculaPromTrimestral(ArrayList<Promedios> PromMensuales,int pesoPromMensual, int PesoBimestral){
        int peso = (pesoPromMensual * 3) + PesoBimestral;
        int nuevoPeso = peso;
        for(Promedios o: PromMensuales){
            if(o.getMes1()==0){
                peso = peso - pesoPromMensual;
            }
            if(o.getMes2()==0){
                 peso = peso - pesoPromMensual;
            }
            if(o.getMes3()==0){
                 peso = peso - pesoPromMensual;
            }
            if(o.getNotaTrimestral()==0){
                 peso = peso - PesoBimestral;
            }
            if(peso==0){
                 peso = 1;
            }
            double promBimestral = 0.0;           
            promBimestral = ((o.getMes1()* pesoPromMensual) + (o.getMes2() * pesoPromMensual) + (o.getMes3() * pesoPromMensual) + (o.getNotaTrimestral()* PesoBimestral))/peso;
            o.setPromedioTrimestral(promBimestral);
            peso = nuevoPeso;
        }
        return PromMensuales;
    }

   public static int PesoMes(int cod_Nivel){
        int peso = 0;
        Connection cn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        String sql = "  select pesoExamenMensual(max(p.cod_progannoacad))    " +
                "from programacion_annoacademico  p " +
                "inner join  tipo_progannoacad t on p.cod_tipoprogannoacad =  t.cod_tipoprogannoacad    " +
                "where  t.cod_tipoprogannoacad = 1 and p.cod_nivel = ? " ;          
        try{             
            cn = Conexion.getConexion();
            ps = cn.prepareStatement(sql);
            ps.setInt(1, cod_Nivel);            
            rs = ps.executeQuery();
            while(rs.next()){
                peso = rs.getInt(1);
            }
        Conexion.cerrarPreparedStatement(ps);
        Conexion.cerrarConexion(cn);
        }catch(SQLException ex){
            ex.printStackTrace();
            Conexion.cerrarPreparedStatement(ps);
            Conexion.cerrarConexion(cn);
        }catch(Exception ex){
            ex.printStackTrace();
        }
        return peso;
    }
    
   
   public static int PesoPromedioMes(int cod_Nivel){
        int peso = 0;
        Connection cn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        String sql = "  select pesoPromMes(max(p.cod_progannoacad))    " +
                "from programacion_annoacademico  p " +
                "inner join  tipo_progannoacad t on p.cod_tipoprogannoacad =  t.cod_tipoprogannoacad    " +
                "where  t.cod_tipoprogannoacad = 1 and p.cod_nivel = ? " ;          
        try{             
            cn = Conexion.getConexion();
            ps = cn.prepareStatement(sql);
            ps.setInt(1, cod_Nivel);            
            rs = ps.executeQuery();
            while(rs.next()){
                peso = rs.getInt(1);
            }
        Conexion.cerrarPreparedStatement(ps);
        Conexion.cerrarConexion(cn);
        }catch(SQLException ex){
            ex.printStackTrace();
            Conexion.cerrarPreparedStatement(ps);
            Conexion.cerrarConexion(cn);
        }catch(Exception ex){
            ex.printStackTrace();
        }
        return peso;
    }
   
      public static int PesoBimTrimestral(int cod_Nivel){
        int peso = 0;
        Connection cn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        String sql = "   select pesoTrimestre(max(p.cod_progannoacad))    " +
                "from programacion_annoacademico  p " +
                "inner join tipo_progannoacad t on p.cod_tipoprogannoacad =  t.cod_tipoprogannoacad    " +
                "where  t.cod_tipoprogannoacad = 1 and p.cod_nivel = ? " ;          
        try{             
            cn = Conexion.getConexion();
            ps = cn.prepareStatement(sql);
            ps.setInt(1, cod_Nivel);            
            rs = ps.executeQuery();
            while(rs.next()){
                peso = rs.getInt(1);
            }
        Conexion.cerrarPreparedStatement(ps);
        Conexion.cerrarConexion(cn);
        }catch(SQLException ex){
            ex.printStackTrace();
            Conexion.cerrarPreparedStatement(ps);
            Conexion.cerrarConexion(cn);
        }catch(Exception ex){
            ex.printStackTrace();
        }
        return peso;
    }
    
   public static ArrayList<Promedios>OrdenarNotas(ArrayList<Promedios> LNotas, ArrayList<Horarios> LCursos){
        ArrayList<Promedios> NuevaLista = new  ArrayList<Promedios>();
        Promedios nota = null;
        for(Horarios c : LCursos){            
            nota = new Promedios();
            nota.setCurso(c.getNombreCurso());            
            for(Promedios n : LNotas){
                if(n.getCurso().equals(c.getNombreCurso())){
                    if(n.getNota1()>0){
                        nota.setNota1(n.getNota1());
                    }
                    if(n.getNota2()>0){
                        nota.setNota2(n.getNota2());
                    }
                    if(n.getNota3()>0){
                        nota.setNota3(n.getNota3());
                    }
                    if(n.getMensual()>0){
                        nota.setMensual(n.getMensual());
                    }              
                }                
            }
            NuevaLista.add(nota);
        }
        return NuevaLista;    
    }
   
   public static ArrayList<Promedios> calculaPromedio(ArrayList<Promedios> L, int pesoSemanal, int pesoMensual){
        int nuevoPesoMensual = pesoMensual;
        int nuevoPesoSemanal = pesoSemanal;
        double  promSemanal = 0.0;
        double  promMensual = 0.0;
        for(Promedios o :L){
            if(o.getNota1()==0){
                pesoSemanal = pesoSemanal - 1;               
            }
            if(o.getNota2()==0){
                pesoSemanal = pesoSemanal - 1;                  
            }
            if(o.getNota3()==0){       
                pesoSemanal = pesoSemanal - 1;                     
            }
            if(pesoSemanal == 0){
                pesoSemanal = 1;
            }
            promSemanal = (o.getNota1() + o.getNota2() + o.getNota3())/pesoSemanal;
            System.out.println("promSemanal: " + promSemanal);
            String ps = ""+promSemanal;
            int index = ps.indexOf(".");
            Double psf=0.0;
            
            if(ps.substring(index).length()>2){
                psf = Double.parseDouble(ps.substring(0, index+3));
            }else{
                psf = promSemanal;
            }            
            System.out.println("promSemanal: " + promSemanal);
            o.setPromedioSemanal(psf);
            pesoSemanal = nuevoPesoSemanal;
            if(o.getMensual()==0){       
                pesoMensual = 0;                     
            }
            int pesoPromMensual  = 1;
            if(o.getPromedioSemanal()==0){
                pesoPromMensual = 0;
            }
            int pesoFinal = pesoMensual + pesoPromMensual;
            if(pesoFinal==0){
                pesoFinal = 1;
            }
            if(o.getMensual()!=0){
                    promMensual = (o.getPromedioSemanal() + (o.getMensual() * pesoMensual))/pesoFinal;
                    System.out.println("o.getPromedioSemanal(): " + o.getPromedioSemanal());
                    System.out.println("o.getMensual(): " + o.getMensual());
                    System.out.println("pesoMensual: " + pesoMensual);
                    System.out.println("pesoFinal: " + pesoFinal);
            }else
                promMensual = 0;
            o.setPromedioMes(promMensual);
            pesoMensual = nuevoPesoMensual;      
        }
        return L;    
    }

    public String getCurso() {
        return curso;
    }

    public void setCurso(String curso) {
        this.curso = curso;
    }

    public double getPromedioMes() {
        return promedioMes;
    }

    public void setPromedioMes(double promedioMes) {
        this.promedioMes = promedioMes;
    }

    public double getPromedioSemanal() {
        return promedioSemanal;
    }

    public void setPromedioSemanal(double promedioSemanal) {
        this.promedioSemanal = promedioSemanal;
    }

    public double getMes1() {
        return mes1;
    }

    public void setMes1(double mes1) {
        this.mes1 = mes1;
    }

    public double getMes2() {
        return mes2;
    }

    public void setMes2(double mes2) {
        this.mes2 = mes2;
    }

    public double getPromedioBimestral() {
        return promedioBimestral;
    }

    public void setPromedioBimestral(double promedioBimestral) {
        this.promedioBimestral = promedioBimestral;
    }

    public double getPromedioTrimestral() {
        return promedioTrimestral;
    }

    public void setPromedioTrimestral(double promedioTrimestral) {
        this.promedioTrimestral = promedioTrimestral;
    }

    public double getMes3() {
        return mes3;
    }

    public void setMes3(double mes3) {
        this.mes3 = mes3;
    }

    public double getNotaBimestral() {
        return notaBimestral;
    }

    public void setNotaBimestral(double notaBimestral) {
        this.notaBimestral = notaBimestral;
    }

    public double getNotaTrimestral() {
        return notaTrimestral;
    }

    public void setNotaTrimestral(double notaTrimestral) {
        this.notaTrimestral = notaTrimestral;
    }

}
